package com.lmy.androidcustomview.view

import android.content.Context
import android.graphics.*
import android.text.TextPaint
import android.util.AttributeSet
import android.view.View
import com.lmy.androidcustomview.R
import com.lmy.androidcustomview.dp

/**
 * @author
 * @功能: 多行文字的View +文字环绕效果
 * @Creat 2/9/21 1:12 PM
 * @Compony 465008238@qq.com
 */

class MultineTextView(context: Context, attributeSet: AttributeSet) : View(context, attributeSet) {
    val text =
        "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Phasellus scelerisque sollicitudin ligula at tincidunt. Aenean tempus magna orci, semper luctus eros posuere ac. Quisque luctus tortor eu sapien hendrerit, a viverra mauris pretium. Quisque purus sapien, consectetur finibus diam ut, dignissim imperdiet nisl. Quisque quis dapibus risus. Interdum et malesuada fames ac ante ipsum primis in faucibus. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Cras id tristique diam. Phasellus fermentum lectus lorem, vitae pretium lacus commodo sed. Aliquam gravida, enim vel condimentum egestas, magna sem accumsan velit, eu fermentum risus nibh nec lorem. Nulla facilisi. Phasellus ornare est quis massa sollicitudin rutrum.\n" +
                "\n" +
                "Etiam et auctor nunc. Nullam id libero ultricies, finibus dui a, imperdiet nisi. Nullam hendrerit, mauris vel tempor condimentum, enim urna laoreet nunc, sit amet vestibulum ante diam ac urna. Quisque sit amet magna a lacus dictum tempor. Integer molestie sem leo, vitae vulputate risus viverra vitae. Pellentesque viverra dapibus nunc. Pellentesque non elementum mauris. Etiam tempor sodales felis, id commodo est gravida et. Etiam tincidunt vel purus at venenatis. Nam quis posuere ligula. Nulla sapien lacus, lobortis ac tincidunt ut, ornare sit amet felis. Duis sollicitudin ultricies tempus. Vestibulum sed ex at massa venenatis ullamcorper.\n" +
                "\n" +
                "Fusce vehicula in libero sit amet euismod. Cras laoreet luctus felis. Interdum et malesuada fames ac ante ipsum primis in faucibus. Vivamus commodo mi pellentesque tellus porta sagittis. Quisque egestas metus quis euismod maximus. Cras egestas porttitor nibh vitae consectetur. Vestibulum congue elit tellus, sed cursus diam fringilla quis.\n" +
                "\n" +
                "Curabitur sit amet velit lorem. Nam imperdiet, diam in lacinia interdum, quam magna porttitor dolor, non sollicitudin libero tortor vitae nulla. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia curae; Nulla vitae eleifend felis, non maximus nulla. Mauris vitae malesuada ex. Sed auctor nunc sed nibh maximus sodales. Nunc eget justo eu mi eleifend tincidunt a id dolor. Aenean consequat egestas diam, quis pellentesque diam accumsan eu. Nam sit amet turpis sit amet est ullamcorper semper. Cras tortor lorem, rutrum nec neque sit amet, efficitur euismod tellus. Cras semper, arcu eget efficitur scelerisque, dolor arcu bibendum eros, ac tristique magna metus sed mauris. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Curabitur nibh nunc, porttitor tincidunt convallis sed, porttitor ac sapien.\n" +
                "\n" +
                "Ut tristique tellus nulla, a fringilla libero vulputate ut. Quisque mattis suscipit magna. Vivamus at placerat ipsum. Donec ut odio feugiat, blandit quam ac, tempor eros. Proin rutrum bibendum venenatis. Nunc quis efficitur ante. Cras facilisis pellentesque dapibus. Mauris sollicitudin at velit tempor hendrerit. Nulla tempor molestie mauris nec tincidunt. Pellentesque sed purus eros."

    private val textpaint = TextPaint(TextPaint.ANTI_ALIAS_FLAG).apply {
        textSize = 16.dp
    }
    private val paint = Paint(Paint.ANTI_ALIAS_FLAG)
    val fontMetrics = Paint.FontMetrics()

    override fun onDraw(canvas: Canvas) {
        super.onDraw(canvas)
        /**
         * 参数
         * 绘制文字
         * TextPaint
         * view的宽度
         * 对齐方式
         * 文字之间间距乘以一个值
         * 文字间距额外的值
         * 行与行之间是不是要额外的间距
         */
//        val staticLayout =
//            StaticLayout(
//                text,
//                paint,
//                width,
//                Layout.Alignment.ALIGN_NORMAL,
//                1f,
//                0f,
//                false
//            )
//        staticLayout.draw(canvas)
        textpaint.getFontMetrics(fontMetrics)
        val measuredWidth = floatArrayOf(0f)
        var start = 0//开始绘制的位置
        var count = 0//每行绘制的实际内容宽度
        var verticalOffset = -fontMetrics.top//向下的偏移量
        var maxWidth: Float
        val IMAGE_WIDTH = 400
        //当start>text的长度时候 绘制结束了 跳出循环
        while (start < text.length) {
            if (verticalOffset + fontMetrics.bottom < 200 || verticalOffset + fontMetrics.top > IMAGE_WIDTH + 200) {
                //如果文字向下的偏移<图片的顶部的偏移(PaddingTop) 则说明文字还没有图片的位置
                //如果文字向下的偏移>图片的宽度(=高度)+图片的顶部Padding 则说明文字已经超过图片的位置
                maxWidth = width.toFloat()
            } else {
                //View宽度-Image宽度
                maxWidth = width - IMAGE_WIDTH.toFloat()
            }
            count =
                textpaint.breakText(
                    text,
                    start,
                    text.length,
                    true,
                    maxWidth.toFloat(),
                    measuredWidth
                )
            canvas.drawText(text, start, start + count, 0f, verticalOffset, textpaint)
            verticalOffset += +textpaint.fontSpacing
            start += count
        }
        canvas.drawBitmap(
            getAvatar(IMAGE_WIDTH),
            width - IMAGE_WIDTH.toFloat(),
            200f,
            paint
        )
    }

    /**
     * 限制图片的大小
     */
    private fun getAvatar(width: Int): Bitmap {
        val options = BitmapFactory.Options()
        options.inJustDecodeBounds = true
        BitmapFactory.decodeResource(resources,
            R.drawable.ic_head, options)
        options.inJustDecodeBounds = false
        options.inDensity = options.outWidth
        options.inTargetDensity = width
        return BitmapFactory.decodeResource(resources,
            R.drawable.ic_head, options)
    }
}
